package com.example.order.mq;

import com.example.order.service.OrderEsSearch;
import com.example.order.service.OrderMybatisService;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import pojo.Order;

import java.io.IOException;

@Component
public class OrderListener {

    @Autowired
    OrderEsSearch orderEsSearch;

    @Autowired
    OrderMybatisService orderMybatisService;

    @Autowired
    RedisTemplate redisTemplate;

    @RabbitListener(queuesToDeclare = @Queue("es.order.option"))
    public void copyDataToEsFromMysql(Channel channel, String msg, Message message) throws IOException {
        try {
            //解析消息
            String[] strings = msg.split("-");
            //获取订单编号
            String orderNumber = strings[0];
            //获取操作类型
            String type = strings[1];
            if (type.equals("create")) {
                // 在es业务类中 没有update这个方法
                // 它将 add 和 update 合并了 save
                //取决于你的实体类中 有不有主键
                //从数据据库中  通过ID获取 订单完整数据（后期可以用redis优化）
                Order order = orderMybatisService.getOrderByOrderNumber(orderNumber);
                orderEsSearch.save(order);
                // 手动确认消息 已经被成功消费 参数：1 消息的标签（主键） 2 是个否批量接受
                channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
            }else if (type.equals("update")){
                //从数据据库中  通过ID获取 订单完整数据（后期可以用redis优化）
                Order order = orderMybatisService.getOrderByOrderNumber(orderNumber);
                orderEsSearch.save(order);
            }
        } catch (Exception e) {
            //异常时执行以下处理机制
            //业务异常的处理
            Object counts = redisTemplate.opsForValue().get("-create");
            if (counts == null) {
                redisTemplate.opsForValue().set("-create", 1);
            } else {
                if ((int) counts <= 10) {
                    int intCount = (int) counts;
                    intCount += 1;
                    redisTemplate.opsForValue().set("-create", intCount);
                } else {
                    //手动确认消息 消费失败 参数：1 消息的标签（主键） 2 是个否批量接受 3 消息是否重回队列
                    channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false);
                    return;
                }
            }
            //手动确认消息 消费失败 参数：1 消息的标签（主键） 2 是个否批量接受 3 消息是否重回队列
            channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);
        }
    }
}
